/* 
 * ProjectFile: message-broker\src\utils\ErrorResult.js
 * Created: lijianwei 2022-06-02 23:17:37
 * -----
 * LastModified: lijianwei 2023-01-10 10:48:32
 * -----
 * Copyright (c) 2016-2023 Rongwen Tech Ltd.
 * -----
 */

import { isString, isNumber, isObject } from "./is.js"

/**
 * [C端]业务中断信息类
 *      专用于业务代码中断时，方法之间[各个js库/js方法之间]的信息返回(信息传递)
 *      页面显示 可以用使用 this.msg 获取其中信息
 *      [推荐]应用内统一的业务错误的判断 if (res instanceof ErrorResult) { ... }
 * 
 * 注意: 要不同的结果，请重新new一个ErrorResult实例
 */
class ErrorResult {
    //私有变量 以免被外部改动
    _status = 0
    _data = {}
    _msg = 'no err'
    _cmdAction = ''

    /**
     * C端信息解析
     * @param res
     * @returns boolean 是否要中断业务 true - 中断(配合if,无需其他判断, 直接执行中断即可), false 不中断
     */
    static clientParseMsg(res) {
        //文字显示 行为的执行
        (res.status % 10 == 1 || res.status % 10 == 2 )&& console.log(res)
        //报错提示
        res.status % 10 == 3 && console.error(res.msg)
        // 返回 业务是否中断 的 指示
        return res.status > 300 || res.status % 100 >= 10
    }
    
    /**
     * 服务端解析
     * @param res 本类1个实例
     * @returns boolean 是否要中断业务 true - 中断(配合if,无需其他判断, 直接执行中断即可), false 不中断
     */
    static serverParseMsg(res) {
        //文字显示 行为的执行
        (res.status % 10 == 1 || res.status % 10 == 2 )&& console.log(res)
        //报错提示
        res.status % 10 == 3 && console.error(res.msg)
        // 返回 业务是否中断 的 指示
        return res.status > 300 || res.status % 100 >= 10
    }

    /**
     * constructor
     *
     * @param mix $message 业务错误信息, OutCode - Enum信息, array - status & messge, string-error message 
     * @param string|int status 业务错误码示意, 默认 页面提示+中断业务 [参考使用]
     * 
     * 判断第几位的数字,可以用取模校对, 如 %10 校验个位数字 
     * 
     *  第1位 错误/跳转                                第2位 业务是否中断[1位会跳转时, 中断无意义]       第3位 提示方式   
     *  [1-普通错误,3-跳转指定页面,7-去登录,9-异常]     [0-正常,1-中断]                                 [0-无需提示,1-console打印,2-抛出错误/报错打印(会影响执行),3-页面提示] 
     * 如:
     *  100/101 隐性提示
     *  103 只页面提示
     *  111 中断 + 隐性提示 
     *  113 中断 + 页面提示 
     *  303 页面提示    + 跳转
     *  700 无提示 断链
     *  703 页面提示    + 断链
     *  110 操作有误, 开发人员提醒
     *  910 程序/系统异常
     */
    constructor(msg, status = 103) {
        if (isString(msg)) {
            if (isNumber(status)) { // 数字
                this._status = status
            } else { // 非数字
                this._data = status
                this._status = 1
            }
            this._msg = msg
        } else if (isObject(msg)) {
            this._status = msg.status || status
            this._msg = msg.msg || '[unkown msg]'
            this._data = msg.data || {}
        } else {
            status = 911
            this._msg = '实例化参数[1] 必须是 object | string'
        }

        if (status > 700) {
            this._cmdAction = 'clientDisconnect'
        }

    }

    get cmdAction() {
        return this._cmdAction
    }
    set cmdAction(val) {
        this._cmdAction = val
    }

    get status() {
        return this._status
    }
    get msg() {
        return this._msg
    }
    get data() {
        return this._data
    }

    set status(value) {
        this._status = value
    }
    set msg(value) {
        this._msg = value
    }
    set data(value) {
        this._data = value
    }
}
export { ErrorResult }
